/*
 * 最小UART驱动
 * 只实现基本的字符输出功能
 */

/* UART寄存器地址定义 */
#define UART_BASE 0x10000000
#define UART_THR  (volatile unsigned char *)(UART_BASE + 0)  /* 发送保持寄存器 */
#define UART_LSR  (volatile unsigned char *)(UART_BASE + 5)  /* 线路状态寄存器 */

/* 线路状态寄存器位定义 */
#define UART_LSR_THRE 0x20  /* 发送保持寄存器空 */

void uart_init(void) {
    // 目前无需初始化
}

/*
 * 输出一个字符
 * 等待UART准备就绪，然后发送字符
 */
void uart_putc(char c) {
    /* 等待发送寄存器空闲 */
    while (!(*UART_LSR & UART_LSR_THRE)) {
        /* 忙等待 */
    }
    
    /* 发送字符 */
    *UART_THR = c;
}

/*
 * 输出字符串
 * 逐个发送字符串中的每个字符
 */
void uart_puts(const char *s) {
    while (*s) {
        uart_putc(*s++);
    }
}

/*
 * 输出十六进制数
 */
void print_hex(unsigned int n) {
    char hex[9];
    hex[8] = '\0';
    for (int i = 7; i >= 0; i--) {
        unsigned int digit = n & 0xF;
        if (digit < 10) {
            hex[i] = '0' + digit;
        } else {
            hex[i] = 'a' + digit - 10;
        }
        n >>= 4;
    }
    uart_puts("0x");
    uart_puts(hex);
}

